<?php
namespace app\common;
use think\controller\Rest;
use think\Validate;
use think\Loader;
use app\constant\api;
use think\Response;
use think\exception\HttpResponseException;
\think\Loader::import('controller/Jump', TRAIT_PATH, EXT);
abstract class RestController extends Rest{
	use \app\common\traits\ControllerTrait,\traits\controller\Jump;
	private $_views=[
        'title'=>"项目标题",
	];
	// public $test="sssss";
	// 验证失败是否抛出异常
	protected $failException = false;
	// 是否批量验证
	protected $batchValidate = false;
	//首先是引入公共的权限判断代码，
    
	//封装一个接口公用的返回值函数
    public function setDirreturnVars($code,$message=null,$data=null,$ishtml=false){
    	 $header=[];
    	 $content=[
            'code'=>$code,
            'message'=>$code?array_get(api\DICTIONARY,$code,$message):$message,
            'data'=>$data,
    	 ];
    	 if ($this->request->get('callback') && preg_match("/^[\w_]+$/", $this->request->get('callback'))) {
			$type = 'jsonp';
			$headers['Content-Type'] = 'text/javascript; charset=utf8';
			/**
			 * 跨域权限设定 暂无设定
			 */
			$headers['Access-Control-Allow-Origin'] = '*';
			$headers['Access-Control-Max-Age'] = '3628800';
			$headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE';
		 }
		 else {
			$type = 'json';
			if (is_array(get_browser(null, true)) && 'ie' == strtolower(get_browser(null, true)['browser'])) {
				$headers['Content-Type'] = 'text/html; charset=utf8';
			}
			else {
				$headers['Content-Type'] = 'application/json; charset=utf8';
			}
		 }
		 return Response::create($content,$type,200,$headers);
    }
	//由于我们需要使用验证器来验证数据，但是我们这里没有继承Controller类，所以不能使用
	//验证器的validate方法，所以我们需要 把这个函数从controller类里面扒过来
   /**
	 * 验证数据
	 *
	 * @access protected
	 * @param array $data
	 *        	数据
	 * @param string|array $validate
	 *        	验证器名或者验证规则数组
	 * @param array $message
	 *        	提示信息
	 * @param bool $batch
	 *        	是否批量验证
	 * @param mixed $callback
	 *        	回调方法（闭包）
	 * @return array|string|true
	 * @throws ValidateException
	 */
	protected function validate($data, $validate, $message = [], $batch = false, $callback = null) {
		if (is_array($validate)) {
			$v = Loader::validate();
			$v->rule($validate);
		}
		else {
			if (strpos($validate, '.')) {
				// 支持场景
				list ($validate, $scene) = explode('.', $validate);
			}
			$v = Loader::validate($validate);
			if (! empty($scene)) {
				$v->scene($scene);
			}
		}
		// 是否批量验证
		if ($batch || $this->batchValidate) {
			$v->batch(true);
		}

		if (is_array($message)) {
			$v->message($message);
		}

		if ($callback && is_callable($callback)) {
			call_user_func_array($callback, [ $v, &$data]);
		}

		if (! $v->check($data)) {
			if ($this->failException) {
				throw new ValidateException($v->getError());
			}
			else {
				return $v->getError();
			}
		}
		else {
			return true;
		}
	}
	//页面变量初始化，-----就是在继承该控制器的模板,我们都会将用户框需要的属性传递到他的页面
    // public function beforeExec(){
    // 	$this->setViewVars([
    //           'username'=>$this->userTool->getName(),
    //           'realname'=>$this->userTool->getRealName(),
    //           'isAdmin'=>intval($this->userTool->isAdmin()),
    // 		]);
    // }
    public function setViewVars($key,$var=null){
        if(is_array($key)){
           $this->_views=array_merge($this->_views,$key);
        }else{
           $this->_views[$key]=$var;
        }
        $this->view->assign($this->_views);
    }

	//登录异常跳转
	public function lognException(){
		$this->redirect("artic/login/index");
	}

	//权限异常跳转
    public function accessException(){
    	$this->redirect('artic/login/access');
    }
   
}